package me.lensfrex.doubandps.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Logger;

/**
 * 针对特定数据类进行excel操作的Worker操作类
 * 其中生成的excel中每个sheet的标题都是根据数据类自动生成的
 *
 * @param <T> 指定的数据类class
 */
public final class ExcelWorker<T> {
    private final static Logger log = Logger.getLogger("ExcelWorkerLogger");

    private final ExcelWriter excelWriter;
    private final ArrayList<WriteSheet> sheets = new ArrayList<>();

    private int sheetAmount = 0;

    /**
     * 根据指定的数据对象来构造一个ExcelWorker对象，其中每个sheet的标题都是根据传入的clazz设定的，建议使用空白的文件，防止数据意外覆盖
     *
     * @param excelFilePath 欲操作的excel文件
     * @param clazz         初设定的sheet标题
     * @throws IOException 如果在初始化操作的时候发生I/O异常
     */
    public ExcelWorker(String excelFilePath, Class<T> clazz) throws IOException {
        File excelFile = new File(excelFilePath);
        if (excelFile.exists()) {
            log.warning("目标excel文件\"" + excelFilePath + "\"已存在，可能会覆盖原有数据或excel文件读取失败。");
        } else {
            excelFile.getParentFile().mkdirs();
            excelFile.createNewFile();
        }

        excelWriter = EasyExcel.write(excelFile).head(clazz).build();
    }

    /**
     * 根据指定的名字创建一个新的Sheet
     *
     * @param sheetName 新的Sheet名字
     * @return 创建后表格中Sheet数量
     */
    public int createNewSheet(String sheetName) {
        sheets.add(EasyExcel.writerSheet(sheetAmount++, sheetName).build());
        return sheetAmount;
    }

    /**
     * 向指定Index添加数据
     *
     * @param sheetIndex 欲添加数据的Sheet的索引
     * @param source     数据源
     */
    public void addAllDataToSheet(int sheetIndex, Collection<T> source) {
        if (sheetIndex >= sheetAmount) {
            System.out.println(("sheet索引过大。传入索引：" + sheetIndex + "， 目前sheet总数：" + sheetAmount));
            return;
        }
        excelWriter.write(source, sheets.get(sheetIndex));
    }

    /**
     * 结束操作，写入文件
     */
    public void finish() {
        excelWriter.finish();
    }

    public int getSheetAmount() {
        return sheetAmount;
    }
}
